package com.gpt.article.service.impl.taskHandle.task;

import chatgpt.ChatGPT;
import chatgpt.entity.chat.ChatCompletion;
import chatgpt.entity.chat.ChatCompletionResponse;
import chatgpt.entity.chat.Message;
import cn.hutool.core.util.RandomUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.gpt.article.domain.GptGenArticleContent;
import com.gpt.article.domain.GptTopicContent;
import com.gpt.article.domain.GptTopicTitle;
import com.gpt.article.domain.GptUseToken;
import com.gpt.article.service.IGptTopicContentService;
import com.gpt.article.service.IGptTopicTitleService;
import com.gpt.article.service.impl.taskHandle.GenTask;
import com.gpt.article.service.impl.taskHandle.GptRequstHelper;
import com.ruoyi.common.utils.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import javax.xml.bind.Element;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Service
public class GenTopicTasker {

    private static Logger logger = LoggerFactory.getLogger(GenTopicTasker.class);
    private static ChatCompletion chatCompletion;
    private static IGptTopicTitleService gptTopicTitleService;
    private static IGptTopicContentService gptTopicContentService;
    @Autowired
    public void setIGptTopicTitleService(IGptTopicTitleService gptTopicTitleService) {
        GenTopicTasker.gptTopicTitleService = gptTopicTitleService;
    }
    @Autowired
    public void setIGptTopicContentService(IGptTopicContentService gptTopicContentService) {
        GenTopicTasker.gptTopicContentService = gptTopicContentService;
    }
    //目录模板
    private String templeHtml = "<li><a href=\"#section{no}\">{content}</a></li>";
    //内容模板
    private String templeTitleContentHtml = "<h3 id=\"section{no}\">{content}</h3>";




    /**
     * 生成主题内容
     * @param gptTopicTitle
     * @param chatGPT
     * @param genTask
     * @param taskId
     * @return
     */
//    [{"title":"12","genPrompts":"12"},{"title":"33","genPrompts":"33"}]
    public boolean genContent33333(GptTopicTitle gptTopicTitle,ChatGPT chatGPT, GenTask genTask, Long taskId){
        String articleGenStyle= gptTopicTitle.getDemandPrompts();
        Long artId = gptTopicTitle.getId();
        String outLineGenStyle = gptTopicTitle.getContentOutline();
        Integer useNum = gptTopicTitle.getUseNum();
        String articleTitle = gptTopicTitle.getTitle();
        String title = gptTopicTitle.getTitle();
        Integer taskNum = genTask.getTaskNum();
        String creteBy = genTask.getAcc();
        JSONArray arrayList = JSONArray.parseArray(outLineGenStyle);
        //随机取大纲的个数
        List<JSONObject> list = new ArrayList<>();
        for (int i = 0; i < arrayList.size(); i++) {
            list.add(arrayList.getJSONObject(i));
        }
//        List<JSONObject> jsonObjectList = createRandoms(list,useNum);
        List outlineList = createRandoms(list,useNum);
        //如果有网站必须包含

        long startTime = System.currentTimeMillis();

//        Map<String,Object> map = startGen1( outlineList, articleTitle, articleGenStyle, gptTopicTitle, chatGPT);
//        Map<String,Object> map = startGen2( outlineList, articleTitle, articleGenStyle, gptTopicTitle, chatGPT);
        Map<String,Object> map = startGen1( outlineList, articleTitle, articleGenStyle, gptTopicTitle, chatGPT);

        long endTime = System.currentTimeMillis();
        long elapsedTime = endTime - startTime;
        logger.info("生成成功！耗时：{}",elapsedTime);

        //文章内容
        String articleContent = String.valueOf(map.get("articleContent"));
        String outlineCalogHtml  =String.valueOf(map.get("outlineCalogHtml"));
        Integer countToken  =Integer.valueOf(String.valueOf(map.get("tokenCount")));
        Integer promptCount  =Integer.valueOf(String.valueOf(map.get("promptCount")));
        Integer completionCount  =Integer.valueOf(String.valueOf(map.get("completionCount")));


        outlineCalogHtml = "<ul>"+outlineCalogHtml+"</ul>";
//        System.out.println("outlineCalogHtml=="+outlineCalogHtml);
        String regex = "<company>(.*?)</company>";
        String keyWords = getKeyWords(regex,articleContent);
        // TODO 纯属定制后面去掉
        Long comstomId = gptTopicTitle.getId();

        String modelName = gptTopicTitle.getUseModel();

        //插入token
        GptUseToken gptUseToken = new GptUseToken();
        gptUseToken.setElapsedTime(elapsedTime);
        gptUseToken.setModuleName("主题文章");

//        gptUseToken.setBusinessId(useToken.getBusinessId());
        gptUseToken.setTaskId(taskId);
        gptUseToken.setUseDate(DateUtils.parseDateToStr("yyyy-MM-dd",new Date()));
        gptUseToken.setUseModel(gptTopicTitle.getUseModel());
//        gptUseToken.setPayMoney(useToken.getPayMoney());
        gptUseToken.setTotalTokens(countToken);
        gptUseToken.setPromptTokens(promptCount);
        gptUseToken.setCompletionTokens(completionCount);
        gptUseToken.setCreateBy(creteBy);
        Long useId = new OptUseTokenDb().insertTokenInfo(gptUseToken);
        System.out.println("insertTokenInfo--tokenId == = "+useId);
        Long titleId =  insertTopicArticle(creteBy,useId,countToken,modelName,comstomId,title,outlineCalogHtml,articleContent,artId,keyWords,taskNum,taskId);
        gptUseToken.setBusinessId(titleId);
        new OptUseTokenDb().updateTolenInfo(gptUseToken);

        return true;
    }


//    public List getWebSite(JSONArray outlineList){
//
//    }


    /**
     * 生成内容，方式1 一次性提问获得所有大纲，然后 获得内容
     * @param outlineList
     * @param articleTitle
     * @param articleGenStyle
     * @param gptTopicTitle
     * @param chatGPT
     * @return
     */
    public Map<String,Object> startGen2(List outlineList,String articleTitle,String articleGenStyle,GptTopicTitle gptTopicTitle,ChatGPT chatGPT){
        Message res =null;
        String arContent = "";
        String readloutlineTitle ="";
        String outlineCalogHtml="";
        String headContentHtml="";
        String readoutlinegenPrompts = "";
        Map<String,Object> map  = new HashMap<String,Object>();

//        Message user =  Message.of(readoutlinegenPrompts);
        Message system = Message.ofSystem(articleGenStyle);

        String contentPromts = "我需要你写一篇关于《"+gptTopicTitle.getTitle()+"》的市场调研，不要出现主观描述，文章段落用<p></p>包裹,段落之间无需换行，我会给你提供大纲" +
                "和每个大纲下内容的要求，请严格按照大纲的要求完成写作任务，大纲内容是：";
        //解析大纲所有要求
        for(int i = 0; i < outlineList.size(); ++i) {
            Object outline = outlineList.get(i);
            JSONObject jsonObject = JSONObject.parseObject(String.valueOf(outline));
            String outlineTitle =String.valueOf( jsonObject.get("title"));
            String outlinegenPrompts= String.valueOf(jsonObject.get("genPrompts"));
            //大纲标题
            readloutlineTitle = outlineTitle.replace("{title}",articleTitle);
            //文章开头
            headContentHtml = templeTitleContentHtml.replace("{no}",(i+1)+"")
                    .replace("{content}",readloutlineTitle);

            outlineCalogHtml+=templeHtml.replace("{no}",(i+1)+"")
                    .replace("{content}",readloutlineTitle);

//            String readoutlinegenPrompts = outlinegenPrompts.replace("{title}",articleTitle);
            //主题主题整理要求+ 每个大纲需求 生成
            readoutlinegenPrompts += i+"、大纲标题："+readloutlineTitle+"；编写要求：用这段html标签开头“"+headContentHtml+"”,"+outlinegenPrompts +"  " +
                    "\n";
        }
        contentPromts+=readoutlinegenPrompts;

        System.out.println("生成要求===="+contentPromts);
        Message user =  Message.of(contentPromts);
        chatCompletion = ChatCompletion.builder()
                .model(gptTopicTitle.getUseModel())
//                    .model(ChatCompletion.Model.GPT_3_5_TURBO_16K.getName())
                .messages(Arrays.asList(system,user))
                .maxTokens(10000)
                .temperature(0.9)
                .build();

//        ChatCompletionResponse response = chatGPT.chatCompletion(chatCompletion);
        ChatCompletionResponse response = new GptRequstHelper().getGptResponse(chatGPT,chatCompletion);
        res = response.getChoices().get(0).getMessage();
        arContent = "<p>"+res.getContent()+"</p>";
        map.put("outlineCalogHtml",outlineCalogHtml);
        map.put("articleContent",arContent);
//        map.put("keyWords",keyWords);
        return map;
    }




    /**
     * 生成内容，方式1 循环提问大纲 获得内容
     * @param outlineList
     * @param articleTitle
     * @param articleGenStyle
     * @param gptTopicTitle
     * @param chatGPT
     * @return
     */
    public Map<String,Object> startGen1(List outlineList,String articleTitle,String articleGenStyle,GptTopicTitle gptTopicTitle,ChatGPT chatGPT){
        Message res =null;
        String arContent = "";
        String readloutlineTitle ="";
        String outlineCalogHtml="";
//        String outlineCalogHtml="<li><a href=\"#section0\">Overview</a></li>";
        String readoutlinegenPrompts = "";
        Map<String,Object> map  = new HashMap<String,Object>();
        //token总数
        Integer tokenCount = 0;
        //提示词token
        Integer promptCount = 0;
        //输出词token
        Integer completionCount = 0;
        for(int i = 0; i < outlineList.size(); ++i) {
            Object outline = outlineList.get(i);
            JSONObject jsonObject = JSONObject.parseObject(String.valueOf(outline));
            String outlineTitle =String.valueOf( jsonObject.get("title"));
            String outlinegenPrompts= String.valueOf(jsonObject.get("genPrompts"));
            //大纲标题
            readloutlineTitle = outlineTitle.replace("{title}",articleTitle);
            logger.info("正在生成大纲"+readloutlineTitle);
            //目录
            outlineCalogHtml += templeHtml.replace("{no}",(i+1)+"")
                    .replace("{content}",readloutlineTitle)+"\n";

            readoutlinegenPrompts = outlinegenPrompts.replace("{title}",articleTitle);
            //主题主题整理要求+ 每个大纲需求 生成
            readoutlinegenPrompts = " 根据主题<"+readloutlineTitle+">生成对应内容，不要出现主观描述，文章段落用<p></p>包裹,段落之间无需换行,按照如下要求："+readoutlinegenPrompts;

            Message user =  Message.of(readoutlinegenPrompts);
            Message system = Message.ofSystem(articleGenStyle);
            List messagesList = null;
            if(StringUtils.isEmpty(articleGenStyle)){
                messagesList = Arrays.asList(user);
            }else{
                messagesList = Arrays.asList(system,user);
            }
            String modelName = gptTopicTitle.getUseModel();
            String contents ="";
//            if(readloutlineTitle.endsWith("ومقدمتها الموجزة والموقع الرسمي")){
            if(readloutlineTitle.endsWith("su breve introducción y sitio web oficial")){
                modelName = "gpt-3.5-turbo-1106";
                arContent += templeTitleContentHtml.replace("{no}",(i+1)+"")
                        .replace("{content}",readloutlineTitle)+"<p>"+contents+"</p>";
            }else{
                chatCompletion = ChatCompletion.builder()
                        .model(modelName)
//                    .model(ChatCompletion.Model.GPT_3_5_TURBO_16K.getName())
//                    .messages(Arrays.asList(system,user))
                        .messages(messagesList)
//                    .maxTokens(GptHelper.calculateMaxToken(gptTopicTitle.getUseModel()))
                        .maxTokens(2000)
                        .temperature(0.9)
                        .build();

                ChatCompletionResponse response = chatGPT.chatCompletion(chatCompletion);
                tokenCount+=Integer.valueOf(String.valueOf(response.getUsage().getTotalTokens()));
                promptCount+=Integer.valueOf(String.valueOf(response.getUsage().getPromptTokens()));
                completionCount+= Integer.valueOf(String.valueOf(response.getUsage().getCompletionTokens()));

                res = response.getChoices().get(0).getMessage();
                 contents = "<p>"+res.getContent()+"</p>";

                //内容
                arContent += templeTitleContentHtml.replace("{no}",(i+1)+"")
                        .replace("{content}",readloutlineTitle)+"<p>"+contents+"</p>";
            }

        }
        map.put("outlineCalogHtml",outlineCalogHtml);
        map.put("articleContent",arContent);
        map.put("tokenCount",tokenCount);
        map.put("promptCount",promptCount);
        map.put("completionCount",completionCount);
//        map.put("keyWords",keyWords);
        return map;
    }





    //插入内容
    public Long insertTopicArticle(String creteBy,Long tokenId,Integer countToken,String modelName,Long comstomId,String title,String outlineCalogHtml,String articleContent,Long artId,String keyWords,Integer taskNum,Long taskId){
        //插入内容
        keyWords = keyWords.replaceAll("Company Name","");
        GptTopicContent gptTopicContent = new  GptTopicContent();
        gptTopicContent.setGenContent(articleContent);
        gptTopicContent.setGenCatalog(outlineCalogHtml);
        gptTopicContent.setTitle(title);
        gptTopicContent.setKeyWords(keyWords);
        gptTopicContent.setCustomId(comstomId);
        gptTopicContent.setUpdateTime(DateUtils.getNowDate());
        Long fileId = gptTopicContentService.insertGptTopicContent(gptTopicContent);
        //更新文章基本信息
        GptTopicTitle gptTopicTitle = new GptTopicTitle();
        gptTopicTitle.setId(artId);
        gptTopicTitle.setModelName(modelName);
        gptTopicTitle.setUseToken(countToken);
        gptTopicTitle.setContentId(fileId);
        gptTopicTitle.setKeyWords(keyWords);
        gptTopicTitle.setStatus("1");
        gptTopicTitle.setUseTokenId(tokenId);
        gptTopicTitle.setUpdateTime(DateUtils.getNowDate());
        gptTopicTitle.setCreateBy(creteBy);
        Long id = gptTopicTitleService.updateGptTopicTitle(gptTopicTitle);
        new XiGaoTasker().upTask(taskId,0,0,taskNum,"2");
        return id;
    }

    /**
     * 获取文中关键词
     * @param regex
     * @param content
     * @return
     */
    public static String getKeyWords(String regex,String content){
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(content);
        String outCotent = "";
        while (matcher.find()) {
            outCotent+=String.valueOf(matcher.group(1))+",";
        }
        outCotent = outCotent.replaceAll("Company \\d+ ", "").replaceAll(":","").trim();
        outCotent = outCotent.replaceAll(",","\n");
        return outCotent;
    }




    public static void main(String[] args) {
        String a = "nihao lihuan yig";
        System.out.println(a.substring(2));
        System.out.println(a.indexOf("ao"));
        System.out.println(a.indexOf("i",2));


    }

    /**
     * 从集合中随机取出N个不重复的元素 ,如果元素包含 mustHas == true，则必然在其中
     * @param list 需要被取出数据的集合
     * @param n 取出的元素数量
     * @return
     */
    private static List<JSONObject> createRandoms(List<JSONObject> list, int n) {
        Map<Integer,String> map = new HashMap<>(16);
        List<JSONObject> news = Lists.newArrayList();
        List<JSONObject> mustHasList = new ArrayList<>();

        // Add items with mustHas == true to new list and remove them from the original list
        list.removeIf(jsonObject -> {
            if(ObjectUtils.isEmpty(jsonObject.getBoolean("mustHas"))){
                return false;
            }
            boolean mustHas = jsonObject.getBoolean("mustHas");
            if (mustHas) {
                mustHasList.add(jsonObject);
            }
            return mustHas;
        });

        if (list.size() + mustHasList.size() <= n) {
            news.addAll(mustHasList);
            news.addAll(list);
            return news;
        }

        news.addAll(mustHasList);
        n -= mustHasList.size();

        while (map.size() < n) {
            int random = (int)(Math.random() * list.size());
            if (!map.containsKey(random)) {
                map.put(random, "");
                news.add(list.get(random));
            }
        }
//        news.sort(Comparator.comparingInt(list::indexOf));
        news.sort(Comparator.comparing(x -> x.getInteger("index")));
        return news;
    }




    /**
     * 从demand_prompts 中提取公司。并重构内容
     * @param gptTopicTitle
     * @param chatGPT
     * @param genTask
     * @param taskId
     * @return
     */
    public boolean genContent23(GptTopicTitle gptTopicTitle,ChatGPT chatGPT, GenTask genTask, Long taskId){
        String artCompany  = gptTopicTitle.getDemandPrompts();
        artCompany = artCompany.replaceAll("\n",",");

        Message res =null;

        String prompts = "帮我找一下这几个公司的官网地址、简介。公司名单："+artCompany+"。无需任何解释。按照我得要求告诉我即可，务必使用阿拉伯文回答。保持多个自然段，段落用<p></p>包裹,段落之间无需换行，回答参照如下：公司名称要求用<company></company>包裹不得出现公司名无关的描述，   每个自然段参照实例：<company>شركة إيرباص</company>\n" +
                "<p>شركة إيرباص هي شركة تصنيع طائرات دولية معروفة. تأسست الشركة في عام 1970 وهي نتاج شراكة بين شركة أيرباص الألمانية وشركة إيرباص الفرنسية. تختص إيرباص في تصميم وتصنيع طائرات الركاب والطائرات التجارية والطائرات العسكرية. تعد إيرباص واحدة من أبرز منافسي شركة بوينغ في صناعة الطيران.</p>\n" +
                "<p>الموقع الرسمي: <a href=\"https://www.airbus.com/\">شركة إيرباص</a></p>;";
        Message user =  Message.of(prompts);
        List messagesList = Arrays.asList(user);

//        Message system = Message.ofSystem(articleGenStyle);
//        List messagesList = null;
//            messagesList = Arrays.asList(user);
        List<String> molList = new ArrayList<String>();
        molList.add("gpt-3.5-turbo-1106");
        molList.add("gpt-3.5-turbo-16k");
        molList.add("gpt-3.5-turbo-16k-0613");
        molList.add("gpt-3.5-turbo");
        molList.add("gpt-3.5-turbo-0613");
        molList.add("gpt-3.5-turbo-0301");
        String useModelName = RandomUtil.randomEle(molList);
        chatCompletion = ChatCompletion.builder()
//                .model(modelName)
                .model(useModelName)
//                    .messages(Arrays.asList(system,user))
                .messages(messagesList)
//                    .maxTokens(GptHelper.calculateMaxToken(gptTopicTitle.getUseModel()))
                .maxTokens(2000)
                .temperature(0.9)
                .build();

        ChatCompletionResponse response = chatGPT.chatCompletion(chatCompletion);

        res = response.getChoices().get(0).getMessage();
        String gencontents = "<p>"+res.getContent()+"</p>";

        GptTopicContent genArticleContent =  gptTopicContentService.selectGptTopicContentByComstomId(gptTopicTitle.getId());

        String allcontent = genArticleContent.getGenContent();
        //找到内容 Official Website</h3><p> 之间插入
        String targetStart = "ومقدمتها الموجزة والموقع الرسمي"+"</h3>";
        String targetEnd = "<p>";

        int startIndex = allcontent.indexOf(targetStart) + targetStart.length();
        int endIndex = allcontent.indexOf(targetEnd, startIndex);

        if (startIndex == -1 || endIndex == -1) {
            throw new IllegalArgumentException("Target strings not found~~~~");
//            return allcontent; // Target strings not found, return original input
        }

        StringBuilder sb = new StringBuilder();
        sb.append(allcontent.substring(0, startIndex));
        sb.append(gencontents);
        sb.append(allcontent.substring(startIndex, endIndex));
        sb.append(gencontents);
        sb.append(allcontent.substring(endIndex));
        String realContent = sb.toString();
        genArticleContent.setGenContent(realContent);
        gptTopicContentService.updateGptTopicContent(genArticleContent);
        gptTopicTitle.setStatus("1");
        gptTopicTitleService.updateGptTopicTitle(gptTopicTitle);
        return true;
    }







    public boolean genContent(GptTopicTitle gptTopicTitle,ChatGPT chatGPT, GenTask genTask, Long taskId){
        String artCompany  = gptTopicTitle.getDemandPrompts();
        if(StringUtils.isEmpty(artCompany)||"null".equals(artCompany)){
            return true;
        }
        artCompany = artCompany.replaceAll("\n",",");

        Message res =null;

        //阿拉伯语
//        String prompts = "帮我找一下这几个公司的官网地址、简介。公司名单："+artCompany+"。无需任何解释。按照我的要求告诉我即可，务必使用阿拉伯文回答。保持多个自然段，段落用<p></p>包裹,段落之间无需换行，回答参照如下：公司名称要求用<company></company>包裹不得出现公司名无关的描述，   每个自然段参照实例：<company>شركة إيرباص</company>\n" +
//                "<p>شركة إيرباص هي شركة تصنيع طائرات دولية معروفة. تأسست الشركة في عام 1970 وهي نتاج شراكة بين شركة أيرباص الألمانية وشركة إيرباص الفرنسية. تختص إيرباص في تصميم وتصنيع طائرات الركاب والطائرات التجارية والطائرات العسكرية. تعد إيرباص واحدة من أبرز منافسي شركة بوينغ في صناعة الطيران.</p>\n" +
//                "<p>الموقع الرسمي: <a href=\"https://www.airbus.com/\">شركة إيرباص</a></p>;";

        //西班牙语
//        String prompts = "帮我找一下这几个公司的官网地址、简介。公司名单："+artCompany+"。无需任何解释。按照我的要求告诉我即可，务必使用西班牙语回答。保持多个自然段，段落用<p></p>包裹,段落之间无需换行，回答参照如下：公司名称要求用<company></company>包裹不得出现公司名无关的描述，   每个自然段参照实例：<company>Boeing</company> " +
//                "<p>Introducción: Boeing es una empresa líder en la industria aeroespacial y de defensa. Se dedica al diseño, fabricación y venta de aviones comerciales, aviones militares, satélites y sistemas de defensa. Boeing ha sido un actor clave en la industria de la aviación durante décadas y ha desarrollado algunos de los aviones más icónicos del mundo, como el Boeing 747 y el Boeing 787 Dreamliner.</p> " +
//                "<p>Sitio web: <a href=\"https://www.boeing.com/\">Boeing</a></p>；";

        //法语
        String prompts = "帮我找一下这几个公司的官网地址、简介。公司名单："+artCompany+"。无需任何解释。按照我的要求告诉我即可，务必使用法语回答。保持多个自然段，段落用<p></p>包裹,段落之间无需换行，回答参照如下：公司名称要求用<company></company>包裹不得出现公司名无关的描述，   每个自然段参照实例：<company>Northrop Grumman Corporation</company> " +
                "<p>Introduction: Northrop Grumman Corporation est une entreprise américaine spécialisée dans la construction de porte-avions. Fondée en 1939, elle conçoit, fabrique et fournit des systèmes aérospatiaux, de défense et de sécurité. Northrop Grumman Corporation est réputée pour son expertise dans la construction de porte-avions modernes et avancés.</p> " +
                "<p>Site Web: <a href=\"https://www.northropgrumman.com/\">Northrop Grumman Corporation</a></p>";

        //阿拉伯语
//        String prompts = "帮我找一下这几个公司的官网地址、简介。公司名单："+artCompany+"。无需任何解释。按照我的要求告诉我即可，务必使用阿拉伯文回答。保持多个自然段，段落用<p></p>包裹,段落之间无需换行，回答参照如下：公司名称要求用<company></company>包裹不得出现公司名无关的描述，   每个自然段参照实例：<company>شركة إيرباص</company>\n" +
//                "<p>شركة إيرباص هي شركة تصنيع طائرات دولية معروفة. تأسست الشركة في عام 1970 وهي نتاج شراكة بين شركة أيرباص الألمانية وشركة إيرباص الفرنسية. تختص إيرباص في تصميم وتصنيع طائرات الركاب والطائرات التجارية والطائرات العسكرية. تعد إيرباص واحدة من أبرز منافسي شركة بوينغ في صناعة الطيران.</p>\n" +
//                "<p>الموقع الرسمي: <a href=\"https://www.airbus.com/\">شركة إيرباص</a></p>;";

        Message user =  Message.of(prompts);
        List messagesList = Arrays.asList(user);

//        Message system = Message.ofSystem(articleGenStyle);
//        List messagesList = null;
//            messagesList = Arrays.asList(user);
        List<String> molList = new ArrayList<String>();
        molList.add("gpt-3.5-turbo-1106");
//        molList.add("gpt-3.5-turbo-16k");
//        molList.add("gpt-3.5-turbo-16k-0613");
        molList.add("gpt-3.5-turbo");
        molList.add("gpt-3.5-turbo-0613");
        molList.add("gpt-3.5-turbo-0301");
        String useModelName = RandomUtil.randomEle(molList);
        chatCompletion = ChatCompletion.builder()
//                .model(modelName)
                .model(useModelName)
//                    .messages(Arrays.asList(system,user))
                .messages(messagesList)
//                    .maxTokens(GptHelper.calculateMaxToken(gptTopicTitle.getUseModel()))
                .maxTokens(3500)
                .temperature(0.9)
                .build();

        ChatCompletionResponse response = chatGPT.chatCompletion(chatCompletion);

        res = response.getChoices().get(0).getMessage();
        String gencontents = "<p>"+res.getContent()+"</p>";

        GptTopicContent genArticleContent =  gptTopicContentService.selectGptTopicContentByComstomId(gptTopicTitle.getId());

        String allcontent = genArticleContent.getGenContent();
        //找到内容 Official Website</h3><p> 之间插入

//        //阿拉伯
//        String targetStart = "ومقدمتها الموجزة والموقع الرسمي"+"</h3>";
//        String targetEnd = "<h3 id=\"section";

        //西班牙语
//        String targetStart = "introducción y sitio web oficial</h3>";
        //法语
        String targetStart = "et leur site Web officiel</h3>";
        String targetEnd = "<h3 id=\"section";

        int startIndex = allcontent.indexOf(targetStart) + targetStart.length();
        int endIndex = allcontent.indexOf(targetEnd, startIndex);

        if (startIndex == -1 || endIndex == -1) {
            throw new IllegalArgumentException("Target strings not found~~~~");
//            return allcontent; // Target strings not found, return original input
        }

        StringBuilder sb = new StringBuilder();
        sb.append(allcontent.substring(0, startIndex));
//        sb.append(targetStart);
//        sb.append(allcontent.substring(startIndex, endIndex));
        sb.append(gencontents);
        sb.append(allcontent.substring(endIndex));
        String realContent = sb.toString();
        genArticleContent.setGenContent(realContent);
        gptTopicContentService.updateGptTopicContent(genArticleContent);
        gptTopicTitle.setStatus("1");
        gptTopicTitleService.updateGptTopicTitle(gptTopicTitle);
        return true;
    }


}
